package com.bookrecomm.vo;

import lombok.Data;
import org.springframework.data.domain.Page;

import java.util.List;

/**
 * 分页结果视图对象
 * 用于封装分页查询的结果
 * @param <T> 数据类型
 */
@Data
public class PageVO<T> {

    /**
     * 当前页码
     */
    private Integer pageNum;

    /**
     * 每页大小
     */
    private Integer pageSize;

    /**
     * 总记录数
     */
    private Long total;

    /**
     * 总页数
     */
    private Integer pages;

    /**
     * 是否有上一页
     */
    private Boolean hasPrevious;

    /**
     * 是否有下一页
     */
    private Boolean hasNext;

    /**
     * 数据列表
     */
    private List<T> list;
    
    /**
     * 设置内容列表（与Spring Data Page兼容）
     * @param content 内容列表
     */
    public void setContent(List<T> content) {
        this.list = content;
    }
    
    /**
     * 设置总记录数（与Spring Data Page兼容）
     * @param totalElements 总记录数
     */
    public void setTotalElements(long totalElements) {
        this.total = totalElements;
    }
    
    /**
     * 设置总页数（与Spring Data Page兼容）
     * @param totalPages 总页数
     */
    public void setTotalPages(int totalPages) {
        this.pages = totalPages;
    }
    
    /**
     * 设置每页大小（与Spring Data Page兼容）
     * @param size 每页大小
     */
    public void setSize(int size) {
        this.pageSize = size;
    }
    
    /**
     * 设置当前页码（与Spring Data Page兼容）
     * @param number 当前页码
     */
    public void setNumber(int number) {
        this.pageNum = number + 1; // Spring Data的页码从0开始，转换为从1开始
    }

    /**
     * 从Spring Data的Page对象创建PageVO对象
     * @param page Spring Data的Page对象
     * @param <T> 数据类型
     * @return PageVO对象
     */
    public static <T> PageVO<T> fromPage(Page<T> page) {
        PageVO<T> pageVO = new PageVO<>();
        pageVO.setPageNum(page.getNumber() + 1); // Spring Data的页码从0开始，转换为从1开始
        pageVO.setPageSize(page.getSize());
        pageVO.setTotal(page.getTotalElements());
        pageVO.setPages(page.getTotalPages());
        pageVO.setHasPrevious(page.hasPrevious());
        pageVO.setHasNext(page.hasNext());
        pageVO.setList(page.getContent());
        return pageVO;
    }

    /**
     * 创建空的分页结果
     * @param <T> 数据类型
     * @return 空的PageVO对象
     */
    public static <T> PageVO<T> empty() {
        PageVO<T> pageVO = new PageVO<>();
        pageVO.setPageNum(1);
        pageVO.setPageSize(10);
        pageVO.setTotal(0L);
        pageVO.setPages(0);
        pageVO.setHasPrevious(false);
        pageVO.setHasNext(false);
        pageVO.setList(List.of());
        return pageVO;
    }
}
